home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
CC_C
/
0924.ZIP
/
SMIO.LIB
< prev
next >
Wrap
Text File
|
1988-03-09
|
17KB
|
452 lines
/* SMC standard IO library */
#list-
/* PRINTF/SPRINTF/FPRINTF ROUTINES - Variadic input from SMC;
fprintf uses putc (and sbrk) and printf uses MSDOS Fn 2 */
printf (fs) char **fs; { int _psc(); return _prout (stdout, fs, _psc); }
fprintf (fs) char **fs; { int putc(); return _prout (*fs, --fs, putc); }
sprintf (fs) char **fs; { int _pss(), c; c = _prout (fs, --fs, _pss);
**fs = 0; return c; }
_prout (fp, pp, wr) int *pp, (*wr)();
{ static char c, pd, *s, *bpt, *fs, buf[30];
static int lj, ln, wd, pr, tt; fs = *pp--;
while (c = *fs++)
{ if (c != '%')
{ if (c == 0x0A && (*wr) (0x0D, fp) == EOF) return EOF;
if ((*wr) (c, fp) != EOF) continue; else return EOF; }
bpt = buf; lj = wd = tt = 0; pr = -1;
if (*fs == '-') { ++fs; ++lj; }
pd = (*fs == '0') ? '0' : ' ';
while ((c = *fs) >= '0' && c <= '9')
{ wd = 10 * wd + c - '0'; ++fs; }
if (*fs == '.') { ++fs; pr = 0;
while ((c = *fs) >= '0' && c <= '9')
{ pr = 10 * pr + c - '0'; ++fs; } }
switch (toupper (c = *fs++))
{ case 'D': if (*pp < 0) { *bpt++ = '-'; *pp = -*pp; }
case 'U': _ffdig (*pp, &bpt, 10);
*bpt = '\0'; bpt = buf; break;
case 'O': _ffdig (*pp, &bpt, 8);
*bpt = '\0'; bpt = buf; break;
case 'X': _ffdig (*pp, &bpt, 16);
*bpt = '\0'; bpt = buf; break;
case 'E': tt = -1; goto fpr;
case 'F': tt = 1; goto fpr;
case 'G': tt = 0;
fpr: if (pr < 0) pr = 6;
_fprt (*(float*)(pp -= 2), buf, pr, tt);
if (*buf == ' ') ++bpt; tt = 0; break;
case 'S': bpt = *pp; tt = 1; break;
case 'C': *bpt++ = *pp; *bpt-- = '\0'; break;
default : if ((*wr) (c, fp) != EOF) continue;
else return EOF; }
s = bpt; while (*s++); ln = s - bpt - 1;
if (tt && pr >= 0 && ln > pr) ln = pr; wd = wd - ln;
if (!lj)
{ if (pd == '0' && *bpt == '-')
{ --ln; if ((*wr) (*bpt++, fp) == EOF) return EOF; }
while (wd-- > 0)
if ((*wr) (pd, fp) == EOF) return EOF; }
while ((c = *bpt++) && ln--)
{ if (c == 0x0A && (*wr) (0x0D, fp) == EOF) return EOF;
if ((*wr) (c, fp) == EOF) return EOF; }
while (wd-- > 0)
if ((*wr) (pd, fp) == EOF) return EOF;
--pp; }
return 0; } /* End of _prout */
/* Dummy print *'s for floats */
_fprt (f, b, p, t) float f; char *b;
{ t = 8; while (t--) *b++ = '*'; *b = 0; }
/* Dummy 2-arg putchar for printf */
_psc (c, z) { bdos (2, c); return c; }
/* String output for sprintf */
_pss (c, p) char **p; { if (c != 0x0D) *(*p)++ = c; return c; }
/* POSITION SCREEN CURSOR - needs ANSI.SYS INSTALLED */
scrloc (x, y) int x, y;
{ static char b[18], *p; p = b;
*p++ = '\33'; *p++ = '[';
_ffdig (y, &p, 10); *p++ = ';';
_ffdig (x, &p, 10); *p++ = 'H';
*p = 0; putstr (b); }
/* Recursive numeral print routine */
_ffdig (n, ptr, base) unsigned n; char **ptr;
{ if (n < base) { *(*ptr)++ = '0' + n + (n > 9 ? 7 : 0); return; }
_ffdig (n / base, ptr, base); _ffdig (n % base, ptr, base); }
/* CONSOLE INPUT/OUTPUT FUNCTIONS */
/* Put string\n to stdout */
puts (s) char *s;
{ static char *t; t = s; while (*t) putch (*t++);
putch ('\n'); return s; }
/* Get stdin line (80 chars max) to s - returns NULL if EOF */
gets (s) char *s;
{ static int c; static char *t; t = s;
do { while ((c = getc (stdin)) == 0x0D);
if (c == 0x0A || c == EOF) break;
*t++ = c; } while ((t - s) < 78);
*t = 0; return ((t == s && c == EOF) ? NULL : s ); }
/* Put single character to stdout */
putch (c) { if (c == 0x0A) bdos (2, 0x0D); bdos (2, c); return c; }
/* Get single stdin character (no EOF) with stdout repeat */
getch() { static v; while ((v = bdos (8, 0)) == 0x0A);
bdos (2, v); if (v == 0x0D) bdos (2, v = 0x0A); return v; }
/* Test if input ready - returns 0 if none */
keyhit() { return bdos (0x0B, 0); }
/* Get raw (extended code) input - no repeat - returns 0 if nul */
rawin () { inline ( 0x31, 0xDB, 0xB4, 0x06, 0xB2, 0xFF, 0xCD, 0x21,
0x74, 0x0E, 0x88, 0xC3, 0x08, 0xDB, 0x75, 0x08,
0xB4, 0x06, 0xB2, 0xFF, 0xCD, 0x21, 0x88, 0xC7 ); }
/* Put string to stdout - MSDOS Fn 6 (Control chars off) except \n. */
/* NB use only to display whole ASCII lines without tabs */
putstr (s) char *s;
{ inline ( 0x89, 0xE5, 0x8B, 0x7E, 0x02, 0x31, 0xDB,
0x8A, 0x05, 0x47, 0x08, 0xC0, 0x74, 0x1B,
0x43, 0x3C, 0x0A, 0x74, 0x08, 0x88,
0xC2, 0xB4, 0x06, 0xCD, 0x21, 0xEB, 0xEC,
0xB2, 0x0D, 0xB4, 0x02, 0xCD, 0x21,
0xB2, 0x0A, 0xB4, 0x02, 0xCD, 0x21, 0xEB, 0xDE ); }
/* Getchar/Putchar fetch/require \r as well as \n, and getchar waits
until \n received - but correctly returns EOF on stdin reassignment. */
putchar (c) { return putc (c, stdout); }
getchar () { return getc (stdin); }
/* BUFFERED SEQUENTIAL FILE INPUT/OUTPUT SYSTEM */
/* File open - modes "r", "a" and "w" byte sequential. */
FILE * fopen (s, m) char *s, *m;
{ static FILE *q; static int c, fd;
if ((c = toupper (*m)) != 'R' &&
c != 'A' && c != 'W') return NULL;
for (q = _iob; q < _iob + _NFIL; ++q)
if (!(q->_bflg & (_READ | _WRITE))) break;
if (q >= _iob + _NFIL) return NULL;
if (c == 'W') fd = creat (s, 0);
else if (c == 'A')
{ if ((fd = open (s, 1)) == -1)
fd = creat (s, 0); seek (fd, 0, 2); }
else if (c == 'R') fd = open (s, 0);
if (fd == -1) return NULL; q->_bfd = fd;
q->_bflg |= (c == 'R') ? _READ : _WRITE;
q->_bptr = NULL; q->_bcnt = 0; return q; }
exit (n)
{ static FILE *q;
for (q = _iob; q < _iob + _NFIL; ++q)
if (q->_bflg & (_READ | _WRITE)) fclose (q);
_exit (n); }
fclose (f) FILE *f;
{ static FILE *q; static int n, v; v = n = 0;
if ((q = f)->_bflg & _WRITE)
{ if (!(q->_bflg & (_UNBUF | _ERR)) && q->_bptr &&
(v = n = q->_bptr - q->_bbase) > 0)
v = write (q->_bfd, q->_bbase, n); }
else if (!(q->_bflg & _READ)) return -1;
v = (close (q->_bfd) == -1 || v != n || q->_bflg & _ERR);
if (q->_bflg & _UNBUF) q->_bbase = NULL; q->_bflg = 0;
return v ? -1 : 0; }
getc (f) FILE *f; /* Reads all bytes - \r as well as \n */
{ static FILE *q;
if (--((q = f)->_bcnt) >= 0) goto getok;
if (!(q->_bflg & _READ) || (q->_bflg & (_EOF | _ERR))) goto geter;
if (!q->_bbase && !(q->_bbase = (FILE *) sbrk (_BSIZ)))
{ q->_bflg |= _ERR; goto geter; }
q->_bcnt = read (q->_bfd, q->_bptr = q->_bbase,
(q->_bflg & _UNBUF) ? 1 : _BSIZ);
if (--(q->_bcnt) >= 0) goto getok;
q->_bflg |= (q->_bcnt == -1 ? _EOF : _ERR);
geter: q->_bcnt = 0; return EOF;
getok: return *(q->_bptr)++; }
ungetc (v, f) FILE *f; /* NB will not accept chars after EOF */
{ static FILE *q;
if (!((q = f)->_bflg & _READ) || ! q->_bbase || ! q->_bptr ||
q->_bptr == q->_bbase) return EOF;
++q->_bcnt; return *--q->_bptr = v; }
putc (v, f) FILE *f; /* Requires all bytes - \r as well as \n */
{ static FILE *q; static int n;
if (!((q = f)->_bflg & _WRITE)) return EOF;
if (--(q->_bcnt) >= 0) return *(q->_bptr)++ = v;
if (q->_bflg & _ERR) goto puter;
if (!q->_bbase && !(q->_bbase = (FILE *) sbrk (_BSIZ)))
{ q->_bflg |= _ERR; goto puter; }
if (!q->_bptr)
{ q->_bptr = q->_bbase; q->_bcnt = _BSIZ - 2; }
*(q->_bptr)++ = v; if (q->_bcnt >= 0) return v;
q->_bcnt = write (q->_bfd, q->_bptr = q->_bbase,
n = (q->_bflg & _UNBUF) ? 1 : _BSIZ);
if ((q->_bcnt)-- == n) return v;
q->_bflg |= _ERR;
puter: q->_bcnt = 0; return EOF; }
/* STORAGE AND HEAP MANAGEMENT */
/* Allocate n cleared units of specified size */
calloc (n, size) unsigned n, size;
{ static unsigned t; static char *p, *s;
p = s = malloc (t = n * size);
if (p == NULL) return NULL; while (t--) *s++ = 0; return p; }
/* Allocate formatted block of nb bytes */
malloc (nb) unsigned nb;
{ static _mhdr *p, *q; static unsigned nt;
nt = 1 + (nb + (sizeof(_mhdr) - 1)) / sizeof(_mhdr);
if ( !(q = _last) )
{ _base._mptr = _last = q = &_base; _base._msiz = 0; }
for (p = q->_mptr; ; q = p, p = p->_mptr)
{ if (p->_msiz >= nt)
{ if (p->_msiz != nt)
{ p->_msiz -= nt; p += p->_msiz; p->_msiz = nt; }
else q->_mptr = p->_mptr;
_last = q; p->_mptr = -1; return ++p; }
if (p == _last)
{ if ( !(p = sbrk(nt * sizeof(_mhdr)))) return NULL;
p->_msiz = nt; free (++p); p = _last; }
} } /* End of malloc */
/* Free formatted block */
free(b) _mhdr *b;
{ static _mhdr *p, *q; p = b-1;
for (q = _last; ; q = q->_mptr)
if ((q < p && q->_mptr > p) ||
(q->_mptr <= q &&
(p > q || p < q->_mptr) )) break;
if (p + p->_msiz != q->_mptr) p->_mptr = q->_mptr;
else { p->_msiz += q->_mptr->_msiz; p->_mptr = q->_mptr->_mptr; }
if (q + q->_msiz != p) q->_mptr = p;
else { q->_msiz += p->_msiz; q->_mptr = p->_mptr; }
_last = q; }
/* Get unformatted heap string - requires heap
start/end addresses set at DS:0x100/0x102 at loadtime */
sbrk (n) unsigned n;
{ static char **hc, **hm, *hn;
hc = 0x100; hm = 0x102; hn = *hc + n;
return (hn >= *hc && hn < *hm) ? (*hc = hn) - n : NULL; }
/* STRING AND CHARACTER FUNCTIONS */
atoi (s) char *s;
{ static int m, v; m = v = 0;
while (*s == ' ' || *s == '\t') ++s;
if (*s == '+' || *s == '-') m = (*s++ == '-');
while (*s >= '0' && *s <= '9') v = 10 * v + (*s++ - '0');
return m ? -v : v; }
isalpha (c)
{ /* if ( c >= 'a' && c <= 'z' ) return 1;
return ( c >= 'A' && c <= 'Z' ); */
inline ( 0x89, 0xE5, 0x8A, 0x46, 0x02, 0x31, 0xDB,
0x3C, 0x41, 0x72, 0x0D, 0x3C, 0x5B, 0x72, 0x08,
0x3C, 0x61, 0x72, 0x05, 0x3C, 0x7B, 0x73, 0x01, 0x43 ); }
isdigit (c)
{ /* return ( c >= '0' && c <= '9' ); */
inline ( 0x89, 0xE5, 0x8A, 0x46, 0x02, 0x31, 0xDB,
0x3C, 0x30, 0x72, 0x05, 0x3C, 0x3A, 0x73, 0x01, 0x43 ); }
isalnum (c)
{ /* if ( c >= '0' && c <= '9' ) return 1;
if ( c >= 'a' && c <= 'z' ) return 1;
return ( c >= 'A' && c <= 'Z' ); */
inline ( 0x89, 0xE5, 0x8A, 0x46, 0x02, 0x31, 0xDB,
0x3C, 0x30, 0x72, 0x15, 0x3C, 0x3A, 0x72, 0x10,
0x3C, 0x41, 0x72, 0x0D, 0x3C, 0x5B, 0x72, 0x08,
0x3C, 0x61, 0x72, 0x05, 0x3C, 0x7B, 0x73, 0x01, 0x43 ); }
isspace (c) { return (c == ' ' || c == '\t' || c == '\r' || c == '\n'); }
strcpy (d, s) char *s, *d;
{ /* do *d++ = *s; while (*s++); */
inline ( 0x89, 0xE5, 0x8B, 0x76, 0x02, 0x8B, 0x7E, 0x04, 0x8A,
0x04, 0x88, 0x05, 0x46, 0x47, 0x08, 0xC0, 0x75, 0xF6 ); }
strlen (s) char *s;
{ inline ( 0x89, 0xE5, 0x8B, 0x5E, 0x02, 0xB9, 0xFF, 0xFF, 0x8A,
0x07, 0x43, 0x41, 0x08, 0xC0, 0x75, 0xF8, 0x89, 0xCB ); }
strcmp(s, t) char *s, *t;
{ /* while (*s == *t) { if (!*s) return 0; ++s; ++t; } return *s - *t; */
inline ( 0x89, 0xE5, 0x8B, 0x5E, 0x04, 0x8B, 0x7E, 0x02, 0x8A,
0x07, 0x3A, 0x05, 0x75, 0x0C, 0x08, 0xC0, 0x74, 0x04,
0x47, 0x43, 0xEB, 0xF2, 0x31, 0xDB, 0xEB, 0x0A, 0x88,
0xC3, 0xB7, 0x00, 0x8A, 0x05, 0xB4, 0x00, 0x29, 0xC3 ); }
strucmp(s, t) char *s, *t;
/* compare with cases equivalent */
{ static char p, q;
while ((p = toupper (*s)) == (q = toupper (*t)))
{ if (!p) return 0; ++s; ++t; } return p - q; }
toupper (c) { return (c >= 'a' && c <= 'z') ? c - 0x20 : c; }
tolower (c) { return (c >= 'A' && c <= 'Z') ? c + 0x20 : c; }
/* SHELL SORT */
sort (f, c, s, n) char *(*f)(); int (*c)(), s, n;
/* f(i) must return address of the i'th data item; c(p, q) must
return true if item *p is correctly sequenced before item *q;
s is sizeof(item) and n is the number of items to sort. */
{ static int g, i, j, k, u; static char *p, *q;
for (g = n >> 1; g > 0; g >>= 1)
for (i = g; i < n; ++i)
for (j = i - g; j >= 0; j -= g)
{ if ((*c)(p = (*f)(j), q = (*f)(j + g))) break;
for (k = 0; k < s; ++k) { u = *p; *p++ = *q; *q++ = u; } } }
/* RANDOM NUMBER GENERATOR */
/* Seed from MSDOS timer byte */
rand() { if (!_rval) _rval = epeek (0, 0x46C);
_rval ^= ( _rval >> 4 ); _rval ^= ( _rval << 11 );
_rval &= 0x7FFF; return _rval; }
/* MEMORY FUNCTIONS */
/* Extended peek - byte from segment, offset */
epeek (seg, off)
{ inline ( 0x89, 0xE5, 0x8B, 0x56, 0x04, 0x8B, 0x5E, 0x02,
0x06, 0x8E, 0xC2, 0x26, 0x8A, 0x1F, 0xB7, 0x00, 0x07 ); }
/* Extended poke - byte to segment, offset */
epoke (val, seg, off)
{ inline ( 0x89, 0xE5, 0x8B, 0x56, 0x04, 0x8B, 0x5E, 0x02, 0x8A,
0x46, 0x06, 0x06, 0x8E, 0xC2, 0x26, 0x88, 0x07, 0x07 ); }
/* Execute in the data segment - mcp points to code array,
bx, cx and di are entry values for BX, CX and DI.
Code must terminate with C3 near return. Returns BX. */
mcrun (bx, cx, di, mcp)
{ static char *bp, mx[] =
{ 0x8B, 0x07, 0x43, 0x43, 0x8B, 0x3F, 0x43, 0x43,
0x8B, 0x0F, 0x43, 0x43, 0x8B, 0x1F, 0x50, 0xC3 };
bp = &mcp; asm (mx, &bp); return bp; }
/* Execute in the data segment - mcp points to code array, bxp points to
to int containing BX value on entry, and set to BX value on exit.
Code must terminate with C3 near return. Returns 16-bit flags value. */
asm (mcp, bxp)
{ inline ( 0x89, 0xE5, 0x8B, 0x4E, 0x04, 0x8B, 0x5E, 0x02,
0x53, 0x8B, 0x1F, 0x0E, 0xE8, 0x00, 0x00, 0x5A,
0x83, 0xC2, 0x0C, 0x52, 0xBA, "\313", 0x52,
0x1E, 0x51, 0xCB, 0x5F, 0x89, 0x1D, 0x9C, 0x5B ); }
/* OPERATING SYSTEM FUNCTIONS */
/* Execute a MSDOS command - returns 0 if OK else Int 4B error code */
system (s) char *s;
{ static int i, pb[7]; static char *p, *cc = "C:COMMAND.COM",
fc[] = " ", cl[50] = { 0, '/', 'C', ' ' };
for (p = cl + 4, i = 0; *s && i < 44; ++i) *p++ = *s++;
*p++ = 0x0D; *p = 0; *cl = i + 3;
inline ( 0xBD, pb, 0x8C, 0xDB, 0xC7, 0x46, 0x00, 0x00, 0x00,
0xC7, 0x46, 0x02, cl, 0x89, 0x5E, 0x04,
0xC7, 0x46, 0x06, fc, 0x89, 0x5E, 0x08,
0xC7, 0x46, 0x0A, fc, 0x89, 0x5E, 0x0C,
0x16, 0x5F, 0x89, 0xE3, 0x2E, 0x89, 0x1E, 0xF8, 0x00,
0x2E, 0x89, 0x3E, 0xFA, 0x00, 0xBB, pb, 0x8B, 0x16, &cc,
0xB8, 0x00, 0x4B, 0xCD, 0x21, 0x2E, 0x8B, 0x1E, 0xF8,
0x00, 0x2E, 0x8B, 0x3E, 0xFA, 0x00, 0x8E, 0xD7, 0x89,
0xDC, 0x89, 0xC3, 0x72, 0x02, 0x31, 0xDB ); }
/* Set FCB from name - returns value 0 if OK,
1 if OK but with wildcards, FF if invalid */
_fcbx (nm, fcb)
{ inline ( 0x89, 0xE5, 0x8B, 0x76, 0x04, 0x8B, 0x7E, 0x02,
0x57, 0xB8, 0x01, 0x29, 0xCD, 0x21, 0x5F, 0x83,
0xC7, 0x20, 0xB9, 0x04, 0x00, 0xC6, 0x05, 0x00,
0x47, 0xE2, 0xFA, 0x88, 0xC3, 0xB7, 0x00 ); }
/* SYSTEM LEVEL FILE I/O - NB Error code is -1 */
creat (name, mode) char *name;
{ /* Modes 00/04 normal/system R/W, 01/05 normal/system R/O */
inline ( 0x89, 0xE5, 0x8B, 0x56, 0x04, 0x8B, 0x4E, 0x02,
0xB4, 0x3C, 0xCD, 0x21, 0x89, 0xC3,
0x73, 0x03, 0xBB, -1 ); }
open (name, mode) char *name;
{ /* Modes 0 read, 1 write, 2 r/w */
inline ( 0x89, 0xE5, 0x8B, 0x56, 0x04, 0x8A, 0x46, 0x02,
0xB4, 0x3D, 0xCD, 0x21, 0x89, 0xC3,
0x73, 0x03, 0xBB, -1 ); }
close (fd)
{ inline ( 0x89, 0xE5, 0x8B, 0x5E, 0x02,
0xB4, 0x3E, 0xCD, 0x21, 0xBB, 0x00, 0x00,
0x73, 0x03, 0xBB, -1 ); }
read (fd, buf, ct) char *buf;
/* returns #read, else 0 EOF or -1 error */
{ inline ( 0x89, 0xE5, 0x8B, 0x5E, 0x06,
0x8B, 0x56, 0x04, 0x8B, 0x4E, 0x02,
0xB4, 0x3F, 0xCD, 0x21, 0x89, 0xC3,
0x73, 0x03, 0xBB, -1 ); }
write (fd, buf, ct) char *buf;
/* returns #written, else 0 disk full or -1 error */
{ inline ( 0x89, 0xE5, 0x8B, 0x5E, 0x06,
0x8B, 0x56, 0x04, 0x8B, 0x4E, 0x02,
0xB4, 0x40, 0xCD, 0x21, 0x89, 0xC3,
0x73, 0x03, 0xBB, -1 ); }
seek (fd, off, org) /* NB SIGNED off, org */
/* org = 0/3 for beginning, 1/4 for current or 2/5 for eof;
if org = 3, 4 or 5 offset is multiplied by 0x200,
returns LSW of absolute byte offset from start of file */
{ static int ff, oh, ol, og; ff = fd;
if ((og = org) < 0) return -1;
else if (og <= 2) { oh = (off < 0) ? -1 : 0; ol = off; }
else if (og <= 5) { oh = off >> 7; ol = off << 9; og -= 3; }
else return -1;
inline ( 0x8B, 0x1E, &ff, 0xA0, &og, 0x8B, 0x0E, &oh,
0x8B, 0x16, &ol, 0xB4, 0x42, 0xCD, 0x21, 0x89, 0xC3,
0x73, 0x03, 0xBB, -1 ); }
reopen (fa, fb)
/* sets fa as duplicate of file handle fb */
{ inline ( 0x89, 0xE5, 0x8B, 0x4E, 0x04, 0x8B, 0x5E, 0x02,
0xB4, 0x46, 0xCD, 0x21, 0xBB, 0x00, 0x00,
0x73, 0x03, 0xBB, -1 ); }
rename (old, new) char *old, *new;
/* rename a file - but no wildcards */
{ inline ( 0x89, 0xE5, 0x8B, 0x56, 0x04, 0x8B, 0x7E, 0x02,
0xB4, 0x56, 0xCD, 0x21, 0xBB, 0x00, 0x00,
0x73, 0x03, 0xBB, -1 ); }
unlink (name) char *name;
/* delete a file */
{ inline ( 0x89, 0xE5, 0x8B, 0x56, 0x02,
0xB4, 0x41, 0xCD, 0x21, 0xBB, 0x00, 0x00,
0x73, 0x03, 0xBB, -1 ); }
/* Exit to system with return code n */
_exit (n) { inline ( 0x89, 0xE5, 0x8A, 0x46, 0x02,
0xB4, 0x4C, 0xCD, 0x21 ); }
/* Basic OS call - returns AL value */
bdos (ah, dx) { inline ( 0x89, 0xE5, 0x8A, 0x66, 0x04, 0x8B, 0x56, 0x02,
0xCD, 0x21, 0x88, 0xC3, 0xB7, 0x00 ); }
/* End of SMIO.LIB */
#list+